package com.qd.panda.gas.station.base;

import com.cdqidi.exception.ApiException;
import com.fasterxml.jackson.databind.JsonNode;
import com.qd.common.panda.domain.entity.carpark.calculate.CalculatePriceDTO;
import com.qd.common.sys.domain.entity.log.SendLogDTO;
import com.qd.panda.gas.station.req.*;
import com.qd.panda.gas.station.resp.PayRespDTO;
import com.qd.panda.model.CarParkGasStation;
import com.qd.panda.service.park.CarParkGasStationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.math.BigDecimal;
import java.util.Optional;

/**
 * 加油接口
 *
 * @author sjk
 * @create 2022-10-18 15:25
 * @since 1.0.0
 */
@Slf4j
public abstract class GasHttpService {
    @Autowired
    protected CarParkGasStationService carParkGasStationService;

    /**
     * 加油站所属公司ID
     *
     * @return ID
     */
    public abstract String stationCompanyId();

    /**
     * 计算订单
     *
     * @param computeReqDTO 计算参数
     * @return 订单ID
     */
    public CalculatePriceDTO compute(ComputeReqDTO computeReqDTO) {
        computeReqDTO.setSendLogDTO(null);
        CarParkGasStation carParkGasStation = Optional.ofNullable(carParkGasStationService.getById(computeReqDTO.getParkId())).orElseThrow(() -> new ApiException("加油站扩展信息不存在"));
        CalculatePriceDTO calculatePrice = new CalculatePriceDTO();
        calculatePrice.setPrice(computeReqDTO.getTotalAmount());
        calculatePrice.setCalculatePrice(computeReqDTO.getTotalAmount());
        calculatePrice.setDiscountAmount(new BigDecimal(0));
        //计算加油站优惠
        carParkGasStationService.buildGasDiscount(computeReqDTO.getParkId(), computeReqDTO.getTotalAmount(), calculatePrice);
//        //计算汽车之家优惠
//        carParkGasStationService.buildAutoHomeDiscount(computeReqDTO.getTotalAmount(), calculatePrice);
//        //计算总优惠
        carParkGasStationService.buildAllDiscount(calculatePrice);
        log.info("自己计算价格，油站所属公司: {},原价: {},优惠价: {},优惠金额: {}", carParkGasStation.getGasStationCompanyName(), computeReqDTO.getTotalAmount(), calculatePrice.getCalculatePriceDisplay(), calculatePrice.getDiscountAmount());
        return calculatePrice;
    }

    /**
     * 创建订单
     *
     * @param payReqDTO 支付参数
     * @return 订单ID
     */
    public abstract PayRespDTO pay(PayReqDTO payReqDTO);

    /**
     * 支付回调
     *
     * @param payNotifyReqDTO 支付参数
     * @return 成功 or 失败
     */
    public abstract boolean payNotify(PayNotifyReqDTO payNotifyReqDTO);

    /**
     * 退款申请
     *
     * @param refundRequestsReqDTO 退款申请参数
     */
    public void refundRequests(RefundRequestsReqDTO refundRequestsReqDTO) {
    }

    /**
     * 退款
     *
     * @param payRefundNotifyReqDTO 退款参数
     * @return 成功 or 失败
     */
    public boolean payRefundNotify(PayRefundNotifyReqDTO payRefundNotifyReqDTO) {
        return false;
    }

    /**
     * 取消订单
     *
     * @param cancelOrderReqDTO 取消订单参数
     * @return 成功 or 失败
     */
    public boolean cancelOrder(CancelOrderReqDTO cancelOrderReqDTO) {
        return false;
    }

    /**
     * 查询加油站列表
     *
     * @param sendLogDTO 记录日志
     * @return 加油站列表
     */
    public JsonNode stations(SendLogDTO sendLogDTO){
        return null;
    }

    /**
     * 查询加油站列表
     *
     * @param pageNumber 页数
     * @param pageSize 每页条数
     * @param sendLogDTO 记录日志
     * @return 加油站列表
     */
    public  JsonNode stations(SendLogDTO sendLogDTO,int pageNumber,int pageSize){
        return null;
    }

    /**
     * 查询加油站详情
     *
     * @param sendLogDTO 加油站ID
     * @return 加油站详情
     */
    public JsonNode getStationById(StationDetailReqDTO sendLogDTO) {
        return null;
    }

    /**
     * 对账接口
     *
     * @param reconciliationReqDTO 查询参数
     * @return 对账单
     */
    public JsonNode reconciliation(ReconciliationReqDTO reconciliationReqDTO) {
        return null;
    }

    /**
     * 余额
     * @return 余额
     */
    public BigDecimal balance(BalanceReqDTO balanceReqDTO){
        return null;
    }
}